package com.literaryfamily.literaryfamily.service.payment;

import com.literaryfamily.literaryfamily.entity.DiscountPrice;
import com.literaryfamily.literaryfamily.entity.Payments;
import com.literaryfamily.literaryfamily.model.ReturnResult;
import org.springframework.lang.Nullable;

import java.util.List;

/**
 * 支付相关接口
 * 所有涉及读写的方法都需要抛出 WriteError 数据库读写错误异常(这个是运行时异常,只需要抛出不需要处理)
 * 此接口所有方法均不检查用户身份,应该验证身份后在进行检查
 * @author 滑稽/因果报应
 */
public interface PaymentService {
	/**
	 * 用来处理订单的方法
	 * transactionId属性为系统内部的单据号
	 * 带支付的订单信息 externalOrders 一栏存储外部支付订单号
	 * 当Payments.paymentAmount属性为负数时表示向外支出操作
	 *
	 * @param payments      完整的订单信息(全部支持)
	 * @param discountPrice 使用优惠卷(可选)
	 * @param type 平台类型:1:电脑 2:手机端
	 * @return 跳转到的url
	 */
	ReturnResult<String> placeAnOrder(Payments payments, @Nullable List<DiscountPrice> discountPrice, int type);


	/**
	 * 查询并更新单状态
	 * 应该查询信息的:微信支付结果,银行卡支付结果,支付宝结果.线下交易或者其他时应该在备注中注明
	 *
	 * @param p 所有的订单信息
	 * @return 查询结果(包括被取消时)
	 */
	ReturnResult<Payments> updateOrder(Payments p) throws Exception;

	/**
	 * 用户取消订单
	 *
	 * @param p   被取消的订单
	 * @param msg 取消原因
	 * @return 操作结果
	 */
	ReturnResult<Payments> closeOrder(Payments p, String msg);

	/**
	 * 根据相关订单查询对应支付记录
	 *
	 * @param p 订单号
	 * @return 查询到的订单号
	 */
	public List<Payments> selectOrderByTransactionId(List<String> p);

	/**
	 * 查询用户的历史订单（分页）
	 */
	ReturnResult<Payments> listUserOrders(Long userId, int page, int size);

}